您可以通过ACK One舰队的应用分发功能将舰队实例中的应用分发至多个关联集群中,无需依赖Git仓库,简化应用部署流程。本文介绍如何在舰队实例中创建应用并根据分发策略分发至多集群中。
前提条件
已开启舰队管理功能。具体操作,请参见开启舰队管理功能。
舰队实例已添加多个关联集群。具体操作,请参见管理关联集群。
已从ACK One控制台获取Fleet实例的KubeConfig,并通过kubectl连接至Fleet实例。
已授予RAM用户AliyunAdcpFullAccess权限。具体操作,请参见为RAM用户授权。
已安装AMC命令行工具。具体操作,请参见AMC命令行帮助。
步骤一(可选):在舰队实例中创建命名空间
如果待分发的应用所在的命名空间在舰队中不存在,您需要先在舰队实例中创建命名空间,如已存在则跳过此步骤。
使用舰队实例的KubeConfig连接舰队实例,执行以下命令,创建示例命名空间demo。
kubectl create namespace demo
步骤二:在舰队实例中创建应用
此处应用支持ConfigMap、Deployment、Service等资源,本文以分发单独一个Nginx Deployment为例介绍。
使用以下内容,创建web-demo.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: namespace: demo name: web-demo spec: replicas: 3 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - name: nginx image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 ports: - containerPort: 80
执行以下命令部署应用。
kubectl apply -f web-demo.yaml
步骤三:在舰队实例中创建分发策略为多集群分发应用
您可以通过定义分发策略(PropagationPolicy)选择需要分发的应用以及对应的集群。创建分发策略后会将匹配到的应用分发到对应集群中。
本文示例:以复制(Duplicated)方式将Deployment weighted-deployment分发到Cluster1和Cluster2中,两集群副本数一致,均为3个。
执行以下命令,获取舰队实例管理的子集群ID。
kubectl get mcl
预期输出:
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx true True True 3d23h cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx true True True 5d21h
使用以下内容,创建propagationpolicy.yaml文件。
说明ClusterPropagationPolicy
用于Cluster Scope资源的分发,PropagationPolicy
用于Namespace Scope资源的分发。apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: ClusterPropagationPolicy metadata: name: web-demo spec: - apiVersion: v1 kind: Namespace name: demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的集群id - ${cluster2-id} # 您的集群id replicaScheduling: replicaSchedulingType: Duplicated --- apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: web-demo namespace: demo spec: preserveResourcesOnDeletion: true # 设置为true,删除舰队上资源时,子集群上资源会被保留。如需同时清理子集群资源,请设置为false。 resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo namespace: demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的集群id - ${cluster2-id} # 您的集群id replicaScheduling: replicaSchedulingType: Duplicated
主要参数说明如下,详细参数说明请参见分发策略。
参数
说明
参数值
resourceSelectors
选择一个或多个待分发的K8s资源。
apiVersion
:指定待分发资源的apiVersion,必选。kind
:指定待分发资源的类型,必选。name
:指定待分发资源的名称。namespace
:指定待分发资源的命名空间。说明PropagationPolicy
只可以选择其本身所在命名空间的资源。labelSelector
:通过标签选择资源。
placement
clusterAffinity
:指定资源要分发的集群。通过clusterNames数组直接指明集群ID。更多其他选择方式请参见分发策略。
说明此处需填写集群ID,不是集群名称。
replicaScheduling
:指定有副本数资源的调度策略。例如Deployment、StatefulSet、Job。replicaSchedulingType
值为Duplicated,表示会将每个资源都复制到集群中,即每个集群都会有spec.Replicas
个副本数。更多说明请参见分发策略。执行以下命令,创建分发策略。
kubectl apply -f propagationpolicy.yaml
步骤四(可选):在舰队实例中创建差异化策略
您可以通过定义差异化策略(OverridePolicy)选择需要差异化部署的集群以及资源。创建差异化策略后会将相应的资源进行定制化修改后再部署到选中的集群中。
本文示例:将部署到Cluster2的应用进行一些差异化修改,将replicas
数修改为1,且将镜像的registry
修改为阿里云的registry
。
使用以下内容,创建overridepolicy.yaml文件。
apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: OverridePolicy metadata: name: example namespace: demo spec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo overrideRules: - targetCluster: clusterNames: - ${cluster2-id} overriders: plaintext: - operator: replace path: /spec/replicas value: 1 imageOverrider: - component: Registry operator: add value: {{Registry}}
主要参数说明如下,详细参数说明请参见差异化策略。
参数
说明
参数值
resourceSelector
选择需要差异化修改的资源。
apiVersion
:指定需要差异化修改资源的apiVersion,必选。kind
:指定需要差异化修改的资源类型,必选。name
:指定需要差异化修改的资源名称。namespace
:指定需要差异化修改的命名空间。说明PropagationPolicy
只可以选择其本身所在命名空间的资源。labelSelector
:通过标签来选择资源。
overrideRules
通过一组覆盖规则修改应用模板。
plaintext
:使用JSON Patch的方式修改模板。imageOverrider
:可以修改镜像的registry
、repository
、version
。
执行以下命令,创建差异化策略。
kubectl apply -f overridepolicy.yaml
步骤五:查看多集群中应用的状态
您可以通过以下AMC命令查看应用的多集群分发状态,也可以直接去关联集群中查看应用的运行状态,以确认舰队应用分发成功。
执行以下命令,查看应用状态。
kubectl amc get deploy -ndemo -M
预期输出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION
web-demo cxxxxxxxxxxxxx 3/3 3 3 3d4h Y
web-demo cxxxxxxxxxxxxx 3/3 3 3 3d4h Y
预期输出表明,应用已经分发至指定的集群中。
步骤六:升级修改应用
使用如下内容修改
web-demo.yaml
,此处以增大replicas
为例。您可以对应用资源做任意修改或升级。apiVersion: apps/v1 kind: Deployment metadata: namespace: demo name: web-demo spec: replicas: 4 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - name: nginx image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 ports: - containerPort: 80
执行以下命令,更新
web-demo.yaml
应用。kubectl apply -f web-demo.yaml
执行以下命令,查看应用状态。
kubectl amc get deploy -ndemo -M
预期输出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION web-demo cxxxxxxxxxxxxx 4/4 4 4 3d4h Y web-demo cxxxxxxxxxxxxx 4/4 4 4 3d4h Y
步骤七:删除应用资源
对于Namespace资源,为防止误删除,舰队只会进行分发不会进行删除。对于其他资源,为防止误删除,默认情况下在删除舰队应用资源或删除分发策略时子集群的应用资源不会被删除。如果您需要清理子集群的应用资源,请按照以下步骤。
修改
ClusterPropagationPolicy
中preserveResourcesOnDeletion
字段为false
,表明删除舰队实例的应用资源时会删除子集群的应用资源。apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: ClusterPropagationPolicy metadata: name: web-demo spec: preserveResourcesOnDeletion: false resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo - apiVersion: v1 kind: Namespace name: demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的集群id - ${cluster2-id} # 您的集群id replicaScheduling: replicaSchedulingType: Duplicated
执行如下命令,更新分发策略。
kubectl apply -f propagationpolicy.yaml
执行如下命令,删除应用资源。
kubectl delete -f web-demo.yaml
执行如下命令,查看应用资源。
kubectl amc get deploy -ndemo -M
预期输出:
cluster(cxxxxxxxxxxxxx): deployments.apps "web-demo" not found cluster(cxxxxxxxxxxxxx): deployments.apps "web-demo" not found
相关文档
如需对多集群中分发的应用进行统一监控,请参见监控管理。
如需实现同城容灾功能,请参见基于ACK One MSE多集群网关实现同城容灾。
关于应用分发策略参数详细信息,请参见分发策略与差异化策略。